package com.chigga.application.hanlder.login.username;

import com.chigga.application.hanlder.login.UserLoginInfo;
import lombok.Getter;
import lombok.Setter;
import org.springframework.security.authentication.AbstractAuthenticationToken;
import org.springframework.security.core.Authentication;

/**
 * 用户名密码登录/身份认证
 * SpringSecurity传输登录认证的数据的载体，相当一个Dto
 * 必须是 {@link Authentication} 实现类
 * 这里选择extends{@link AbstractAuthenticationToken}，而不是直接implements Authentication,
 * 是为了少些写代码。因为{@link Authentication}定义了很多接口，我们用不上。
 * @author DefChigga
 */
@Getter
@Setter
// AbstractAuthenticationToken implements Authentication, CredentialsContainer
public class UsernameAuthentication extends AbstractAuthenticationToken {

  // 前端传过来的用户名
  private String username;
  // 前端传过来的密码
  private String password;
  // 认证成功后，后台从数据库获取信息
  private UserLoginInfo currentUser;

  public UsernameAuthentication() {
    // TODO: 设置权限
    // 权限，用不上，直接null
    super(null);
  }

  /**
   * 获取密码/null
   */
  @Override
  public Object getCredentials() {
    // 根据SpringSecurity的设计，授权成功之后，Credential（比如，登录密码）信息需要被清空
    return super.isAuthenticated() ? null : password;
  }

  /**
   * 获取用户名/用户信息
   */
  @Override
  public Object getPrincipal() {
    // 根据SpringSecurity的设计，授权成功之前，getPrincipal返回的客户端传过来的数据。授权成功后，返回当前登录用户的信息
    return super.isAuthenticated() ? currentUser : username;
  }

}
